#include "register_dialog.hpp"
#include "client_wrapper.h"
#include <QMessageBox>

RegisterDialog::RegisterDialog(ClientWrapper *clientWrapper, QWidget *parent)
    : QDialog(parent), m_clientWrapper(clientWrapper)
{
    setWindowTitle(tr("注册新用户"));
    setMinimumWidth(350);

    // 初始化 UI
    setupUI();

    // 连接信号和槽
    connect(m_registerButton, &QPushButton::clicked, this, &RegisterDialog::onRegisterClicked);
    connect(m_cancelButton, &QPushButton::clicked, this, &RegisterDialog::onCancelClicked);

    // 连接到ClientWrapper的注册结果信号
    if (m_clientWrapper)
    {
        connect(m_clientWrapper, &ClientWrapper::registerResult,
                this, &RegisterDialog::onRegistrationFinished, Qt::QueuedConnection);
    }
}

RegisterDialog::~RegisterDialog()
{
}

void RegisterDialog::setupUI()
{
    // 创建主布局
    QVBoxLayout *mainLayout = new QVBoxLayout(this);

    // 创建表单布局
    QFormLayout *formLayout = new QFormLayout();

    // 用户名编辑框
    m_usernameEdit = new QLineEdit(this);
    formLayout->addRow(tr("用户名:"), m_usernameEdit);

    // 密码编辑框
    m_passwordEdit = new QLineEdit(this);
    m_passwordEdit->setEchoMode(QLineEdit::Password);
    formLayout->addRow(tr("密码:"), m_passwordEdit);

    // 确认密码编辑框
    m_confirmPasswordEdit = new QLineEdit(this);
    m_confirmPasswordEdit->setEchoMode(QLineEdit::Password);
    formLayout->addRow(tr("确认密码:"), m_confirmPasswordEdit);

    // 添加表单到主布局
    mainLayout->addLayout(formLayout);

    // 创建状态标签
    m_statusLabel = new QLabel(tr("请填写注册信息"), this);
    mainLayout->addWidget(m_statusLabel);

    // 创建按钮布局
    QHBoxLayout *buttonLayout = new QHBoxLayout();

    // 注册按钮
    m_registerButton = new QPushButton(tr("注册"), this);
    buttonLayout->addWidget(m_registerButton);

    // 取消按钮
    m_cancelButton = new QPushButton(tr("取消"), this);
    buttonLayout->addWidget(m_cancelButton);

    // 添加按钮布局到主布局
    mainLayout->addLayout(buttonLayout);

    // 设置主布局
    setLayout(mainLayout);
}

bool RegisterDialog::validateInput()
{
    // 验证用户名
    if (m_usernameEdit->text().trimmed().isEmpty())
    {
        showError(tr("输入错误"), tr("请输入用户名"));
        return false;
    }

    // 验证密码
    if (m_passwordEdit->text().isEmpty())
    {
        showError(tr("输入错误"), tr("请输入密码"));
        return false;
    }

    // 验证密码长度
    if (m_passwordEdit->text().length() < 6)
    {
        showError(tr("输入错误"), tr("密码长度必须至少为6个字符"));
        return false;
    }

    // 验证两次密码输入是否一致
    if (m_passwordEdit->text() != m_confirmPasswordEdit->text())
    {
        showError(tr("输入错误"), tr("两次输入的密码不一致"));
        return false;
    }

    return true;
}

void RegisterDialog::showError(const QString &title, const QString &message)
{
    QMessageBox::critical(this, title, message);
}

void RegisterDialog::onRegisterClicked()
{
    if (!validateInput())
    {
        return;
    }

    // 检查是否已连接以及ClientWrapper实例是否存在
    if (!m_clientWrapper || !m_clientWrapper->isConnected())
    {
        showError(tr("连接错误"), tr("未连接到服务器或客户端包装器无效，无法注册"));
        return;
    }

    QString username = m_usernameEdit->text().trimmed();
    QString password = m_passwordEdit->text();

    m_statusLabel->setText(tr("正在注册..."));
    m_registerButton->setEnabled(false); // 禁用按钮防止重复点击
    m_cancelButton->setEnabled(false);

    // 调用ClientWrapper的注册方法
    m_clientWrapper->registerUser(username, password);
    // 结果将通过 onRegistrationFinished 槽异步处理
}

void RegisterDialog::onCancelClicked()
{
    // 关闭对话框
    reject();
}

// 新增槽函数实现
void RegisterDialog::onRegistrationFinished(bool success, const QString &message)
{
    m_registerButton->setEnabled(true); // 重新启用按钮
    m_cancelButton->setEnabled(true);

    if (success)
    {
        m_statusLabel->setText(tr("注册成功!"));
        QMessageBox::information(this, tr("注册成功"), message);
        emit registerSuccessful(m_usernameEdit->text().trimmed());
        accept(); // 关闭对话框
    }
    else
    {
        m_statusLabel->setText(tr("注册失败."));
        showError(tr("注册失败"), message);
    }
}